home *** CD-ROM | disk | FTP | other *** search
/ Night Owl 6 / Night Owl's Shareware - PDSI-006 - Night Owl Corp (1990).iso / 026a / dialog.zip / DIALOG.PRG < prev   
Text File  |  1991-01-19  |  6KB  |  197 lines

  1. *******************************************************************************
  2. *  JUST A REMINDER:                                   *
  3. *                                          *    
  4. *  The source code contained herein is considered public domain.  You may     *
  5. *  use all or part in your own applications.  Since I have taken the time to  *
  6. *  develop and debug this utility, my only request is that you give me credit *
  7. *  where credit is due.                                                       *
  8. *                                                                             *
  9. *  Thank you,                                                                 *
  10. *                                             *    
  11. *  Todd W. Lindley                                      *
  12. *  a/k/a Slice                                                  *
  13. *******************************************************************************
  14.  
  15. *******************************************************************************
  16. *    Name: DIALOG.PRG                                            *
  17. *  Author: Todd W. Lindley                              *
  18. *    Date: 1-14-91                                  *
  19. *    Desc: Generates a dialog box which allows the user to make a selection   *
  20. *          by pressing the first character of a choice or hi-lighting an item *
  21. *          and pressing enter. The function then returns a numerical value    *
  22. *          associated with the dialog item or a 0 if Esc is pressed.          *
  23. *   Usage:                                             *
  24. *          choice=DIALOG(# BOXES,"STR1","STR2","STR3",ROW,COL,MESSAGE)        *
  25. *                                              *
  26. *   WHERE                                       *
  27. *          # BOXES        = Number of selection items to display              *
  28. *          STR1,STR2,STR3 = Selection descriptions                       *
  29. *          ROW,COL        = Upper left row,column of box                      *
  30. *          MESSAGE        = Message to display                          *    
  31. *                                                 *
  32. * Example:                                      *
  33. *          choice=DIALOG(3," Yes "," No "," Cancel ",10,20,"Are You Sure?")   *
  34. *      OR                                         *
  35. *          choice=DIALOG(2," Yes "," No "," ",10,20,"Are You Sure?")          *
  36. *                                          *
  37. *   Notes:                                      *
  38. *                                                                             * 
  39. *          - This routine can easily be modified into a procedure             *
  40. *          - DIALOG does not check the validity of passed parameters          *
  41. *          - Make sure that 1st character of each dialog item is unique       *
  42. *          - The first item is always hi-lighted                              *
  43. *            - You might want to add another parameter that positions the     *
  44. *              cursor on an item other than the first one                     *
  45. *                                          *
  46. * Comments, questions, or suggestions?  Please leave mail addressed to Slice  *
  47. * on the Ashton Tate BBS                                     *
  48. *******************************************************************************
  49.  
  50. FUNCTION dialog
  51. PARA maxdial,dial1,dial2,dial3,srow,scol,mess
  52.  
  53. ** SAVE CURRENT SCREEN  
  54.   SAVE SCREEN TO dialscrn
  55.  
  56. ** SAVE STATUS OF A FEW "SET" FUNCTIONS
  57.  
  58.   esc_stat=SET("ESCAPE")
  59.   old_colrs=SET("ATTRIBUTES")
  60.   old_talk=SET("TALK")
  61.   SET TALK OFF
  62.   SET ESCAPE OFF
  63.   SET CURSOR OFF
  64.  
  65. ** COLUMN 1 STORES DIALOG STRING, COLUMN 2 STORES DISPLAY COLUMN 
  66.   DECLARE dial[3,2]
  67.   erow=srow+5
  68.   ecol=0
  69.   gap=1
  70.  
  71. ** IF WE ONLY NEED 2 BOXES THEN SET THIRD BOX TO A CHAR. THAT WON'T BE SELECTED
  72.  
  73.   IF maxdial=2 
  74.     dial3=CHR(133)
  75.   ENDIF
  76.  
  77. ** IF WE ONLY NEED 1 BOX THEN SET 2ND AND THIRD BOX TO A CHAR. THAT WON'T BE SELECTED
  78.  
  79.   IF maxdial=1
  80.     dial2=CHR(133)
  81.     dial3=CHR(133)
  82.   ENDIF
  83.  
  84.  
  85. ** PUT DIALOG ITEM AND DISPLAY COLUMN IN ARRAY
  86.   tcol=scol+2
  87.   dial[1,1]=dial1
  88.   dial[1,2]=tcol
  89.   dial[2,1]=dial2
  90.   dial[2,2]=tcol+LEN(dial[1,1])+gap
  91.   dial[3,1]=dial3
  92.   dial[3,2]=dial[2,2]+LEN(dial[2,1])+gap
  93.  
  94. ** ESTABLISH ENDING COLUMN OF WINDOW
  95. ** WE NEED TO FIGURE OUT WHICH IS LONGER, MESSAGE OR DIALOG ITEMS
  96.  
  97.   width=LEN(dial[1,1]+dial[2,1]+dial[3,1])+2
  98.   ecol=IIF(width>LEN(mess),width,LEN(mess))+(gap*3)+scol
  99.  
  100. ** IF THE MESSAGE LENGTH PASSED TO PROGRAM IS LONGER THAN LENGTH OF DIALOG
  101. ** ITEMS, THEN CENTER DIALOG ITEMS
  102.  
  103.   IF LEN(mess) > width        
  104.     center=INT((ecol-scol)/2+scol)
  105.     half=INT(width/2)
  106.     newcol=center-half+1
  107.     dial[1,2]=newcol
  108.     dial[2,2]=newcol+LEN(dial[1,1])+gap
  109.     dial[3,2]=dial[2,2]+LEN(dial[2,1])+gap
  110.   ENDIF    
  111.  
  112. ** DRAW WINDOW
  113.  
  114.   @srow,scol CLEAR TO erow,ecol
  115.   ptr=1
  116.   @srow,scol TO erow,ecol DOUBLE
  117.  
  118. ** DISPLAY DIALOG ITEMS
  119.   @srow+3,dial[1,2] SAY dial[1,1]
  120.  
  121.  ** IF ONLY USING 1 DIALOG ITEM THEN SKIP SECOND
  122.   IF maxdial = 2 .OR. maxdial = 3
  123.     @srow+3,dial[2,2] SAY dial[2,1]
  124.   ENDIF
  125.  
  126.  ** IF ONLY USING 2 DIALOG ITEMS THEN SKIP THIRD
  127.   IF maxdial = 3 
  128.     @srow+3,dial[3,2] SAY dial[3,1]
  129.   ENDIF
  130.  
  131.   @srow,scol FILL TO erow,ecol COLOR N/W
  132.   @srow+1,scol+2 SAY mess COLOR R/W
  133.  
  134. ** DRAW SHADOW
  135.   @srow+1,ecol+1 FILL TO erow,ecol+2 COLOR W/N
  136.   @erow+1,scol+2 FILL TO erow+1,ecol+2 COLOR W/N
  137.  
  138. ** MAIN LOOP - READS KEYBOARD
  139. DO revdisp
  140. DO WHILE .T.
  141.   x=INKEY()
  142.   DO CASE
  143.     CASE x=4                && RIGHT ARROW
  144.       DO nrmldisp
  145.       ptr=ptr+1
  146.       IF ptr>maxdial
  147.         ptr=1
  148.       ENDIF
  149.       DO revdisp
  150.     CASE x=19               && LEFT ARROW
  151.       DO nrmldisp
  152.       ptr=ptr-1
  153.       IF ptr<1
  154.         ptr=maxdial
  155.       ENDIF
  156.       DO revdisp
  157.  
  158. ** CHECK FOR 1ST CHARACTER OF EACH DIALOG BOX - UPPER OR LOWER CASE
  159.  
  160.     CASE x=ASC(UPPER(SUBSTR(LTRIM(dial[1,1]),1,1))) .OR. x=ASC(LOWER(SUBSTR(LTRIM(dial[1,1]),1,1)))            
  161.       ptr=1
  162.       EXIT
  163.     CASE x=ASC(UPPER(SUBSTR(LTRIM(dial[2,1]),1,1))) .OR. x=ASC(LOWER(SUBSTR(LTRIM(dial[2,1]),1,1)))
  164.       ptr=2
  165.       EXIT
  166.     CASE x=ASC(UPPER(SUBSTR(LTRIM(dial[3,1]),1,1))) .OR. x=ASC(LOWER(SUBSTR(LTRIM(dial[3,1]),1,1)))
  167.       ptr=3
  168.       EXIT
  169.  
  170.     CASE x=13               && ENTER
  171.       EXIT
  172.     CASE x=27               && ESC     
  173.       ptr=0
  174.       EXIT
  175.   ENDCASE
  176. ENDDO
  177.  
  178. ** RETURN TO CALLING PROGRAM
  179.  
  180. RESTORE SCREEN FROM dialscrn
  181. SET ESCAPE &esc_stat
  182. SET COLOR TO &old_colrs
  183. SET TALK &old_talk
  184. RELEASE SCREEN dialscrn
  185. RELEASE esc_stat,old_colrs,x,center,half,newcol,erow,ecol,gap,maxdial,tcol
  186. RELEASE old_talk
  187. SET CURSOR ON
  188. RETURN(ptr)
  189.  
  190. PROCEDURE nrmldisp
  191.   @srow+3,dial[ptr,2] SAY dial[ptr,1] COLOR N/W
  192. RETURN
  193.  
  194. PROCEDURE revdisp
  195.   @srow+3,dial[ptr,2] SAY dial[ptr,1] COLOR W+/N
  196. RETURN
  197.